package com.pug.zixun.service.category;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pug.zixun.bo.CourseCategoryBo;
import com.pug.zixun.commons.enums.ResultStatusEnum;
import com.pug.zixun.commons.ex.PugValidatorException;
import com.pug.zixun.commons.utils.fn.asserts.Vsserts;
import com.pug.zixun.mapper.CategoryMapper;
import com.pug.zixun.pojo.CourseCategory;
import com.pug.zixun.vo.CategoryVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;



/**
 * CategoryServiceImpl实现类
 * 创建人:yykk<br/>
 * 时间：2022-05-23 14:38:43 <br/>
 * 源码下载：前台代码 git clone https://gitee.com/kekesam/kuangstudy-pug-ui.git
 * 飞哥B站地址：后台代码 git clone https://gitee.com/kekesam/kuangstudy-pug-parent.git
 * @version 1.0.0<br/>
 *
*/
@Service
@Slf4j
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, CourseCategory> implements ICategoryService  {

    /**
     * 查询文章分类管理列表信息
     * @method: findCategoryList
     * @result : List<CategoryBo>
     * 创建人:yykk
     * 创建时间：2022-05-23 14:38:43
     * @version 1.0.0
     * @return
     */
    @Override
    public List<CourseCategoryBo> findCategoryTree(String keyword){
        // 1 :查询表中所有的数据
        LambdaQueryWrapper<CourseCategory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(Vsserts.isNotEmpty(keyword), CourseCategory::getTitle,keyword);
        List<CourseCategory> allList = this.list(lambdaQueryWrapper); // 思考空间，为什么查询的是所有

        List<CourseCategoryBo> courseCategoryBos = tranferListBo(allList, CourseCategoryBo.class);
        log.info(courseCategoryBos+">>>>>>>");
        // 2: 找到所有的根节点 pid = 0
        List<CourseCategoryBo> rootList = courseCategoryBos.stream().filter(category -> category.getParentId().equals(0L))
                .sorted((a, b) -> a.getSort() - b.getSort()).collect(Collectors.toList());
        // 3 : 查询所有的非根节点
        List<CourseCategoryBo> subList = courseCategoryBos.stream().filter(category -> !category.getParentId().equals(0L)).collect(Collectors.toList());
        // 4 : 循环根节点去subList去找对应的子节点
        rootList.forEach(root -> buckForback(root, subList));

        return rootList;
    }

    private void buckForback(CourseCategoryBo root, List<CourseCategoryBo> subList) {
        // 通过根节点去id和子节点的pid是否相等，如果相等的话，代表是当前根的子集
        List<CourseCategoryBo> childrenList = subList.stream().filter(category -> category.getParentId().equals(root.getId()))
                .sorted((a, b) -> a.getSort() - b.getSort())
                .collect(Collectors.toList());
        // 如果你当前没一个子集，初始化一个空数组
        if (!CollectionUtils.isEmpty(childrenList)) {
            // 查询以后放回去
            root.setChildren(childrenList);
            // 再次递归构建即可
            childrenList.forEach(category -> buckForback(category, subList));
        } else {
            root.setChildren(new ArrayList<>());
        }
    }

    /**
     * 查询分页&搜索文章分类管理
     * @param categoryVo
     * @return IPage<Category>
     * 创建人:yykk
     * 创建时间：2022-05-23 14:38:43
     * @version 1.0.0
     */
    @Override
	public IPage<CourseCategoryBo> findCategoryPage(CategoryVo categoryVo){
	    // 设置分页信息
		Page<CourseCategory> page = new Page<>(categoryVo.getPageNo(),categoryVo.getPageSize());
		// 设置查询条件
        LambdaQueryWrapper<CourseCategory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // lambdaQueryWrapper.select(Category.class, column -> !column.getColumn().equals("description"));
        // 根据关键词搜索信息
        lambdaQueryWrapper.like(Vsserts.isNotEmpty(categoryVo.getKeyword()), CourseCategory::getTitle,categoryVo.getKeyword());
         //查询发布的 0 未发布  1 发布
        lambdaQueryWrapper.eq(categoryVo.getStatus() != null , CourseCategory::getStatus,categoryVo.getStatus());
        // 多列搜索
        // lambdaQueryWrapper.and(Vsserts.isNotEmpty(categoryVo.getKeyword()),wrapper -> wrapper
        //         .like(Category::getName, categoryVo.getKeyword())
        //         .or()
        //         .like(Category::getCategoryName, categoryVo.getKeyword())
        // );
        // 根据时间排降序
         // 查询分页返回
		IPage<CourseCategory> results = this.page(page,lambdaQueryWrapper);
		return tranferPageBo(results, CourseCategoryBo.class);
	}

    /**
     * 查询文章分类管理列表信息
     * @method: findCategoryList
     * @result : List<Category>
     * 创建人:yykk
     * 创建时间：2022-05-23 14:38:43
     * @version 1.0.0
     * @return
    */
    @Override
    public List<CourseCategoryBo> findCategoryList() {
     	// 1：设置查询条件
        LambdaQueryWrapper<CourseCategory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 2：查询发布的 0 未发布  1 发布
        lambdaQueryWrapper.eq(CourseCategory::getStatus,1);
        // 3: 查询返回
        return tranferListBo(this.list(lambdaQueryWrapper), CourseCategoryBo.class);
    }

	/**
     * 根据id查询文章分类管理明细信息
     * @param id
     * @return Category
     * 创建人:yykk
     * 创建时间：2022-05-23 14:38:43
     * @version 1.0.0
     */
    @Override
    public CourseCategoryBo getCategoryById(Long id) {
        return tranferBo(this.getById(id), CourseCategoryBo.class);
    }


    /**
     * 保存&修改文章分类管理
     * @param courseCategory
     * @return Category
     * 创建人:yykk
     * 创建时间：2022-05-23 14:38:43
     * @version 1.0.0
     */
    @Override
	public CourseCategoryBo saveupdateCategory(CourseCategory courseCategory){
		boolean flag = this.saveOrUpdate(courseCategory);
		return flag ? tranferBo(courseCategory, CourseCategoryBo.class)  : null;
	}



    /**
     * 根据id删除文章分类管理
     * @param id
     * @return int
     * 创建人:yykk
     * 创建时间：2022-05-23 14:38:43
     * @version 1.0.0
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteCategoryById(Long id) {
        // 物理删除removeByID
        //List<Category> categoryTreeByPid = new CategoryServiceImpl().findCategoryTreeByPid(id);
        //this.removeByIds(categoryTreeByPid);

        // 物理删除
        CourseCategory courseCategory = this.getById(id);
        if(courseCategory !=null) {
            CourseCategory newCourseCategory = new CourseCategory();
            newCourseCategory.setId(id);
            boolean b = this.updateById(newCourseCategory);
            return 1;
        }
        return 0;
    }


    /**
     * 根据id找到所有孙子元素包含自己
     * 主要是为了进行批量删除
     * @method: findCategoryList
     * @result : List<CategoryBo>
     * 创建人:yykk
     * 创建时间：2022-05-23 14:38:43
     * @version 1.0.0
     * @return
     */
    public List<CourseCategory> findCategoryTreeByPid(Long pid){
        // 1 :查询表中所有的数据
        LambdaQueryWrapper<CourseCategory> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        List<CourseCategory> allList = this.list(lambdaQueryWrapper); // 思考空间，为什么查询的是所有
        List<CourseCategory> resultList = new ArrayList<>();
        // 2: 找到所有的根节点 pid = 0
        List<CourseCategory> rootList = allList.stream().filter(item->item.getId().equals(pid)).collect(Collectors.toList());
        // 4 : 循环根节点去subList去找对应的子节点
        rootList.forEach(root -> {
            resultList.add(root);
            buckForbackByPid(resultList,root, allList);
        });
        return resultList;
    }


    private void buckForbackByPid(List<CourseCategory> rootList , CourseCategory root, List<CourseCategory> subList) {
        // 通过根节点去id和子节点的pid是否相等，如果相等的话，代表是当前根的子集
        List<CourseCategory> childrenList = subList.stream().filter(courseCategory -> courseCategory.getParentId().equals(root.getId()))
                .sorted((a, b) -> a.getSort() - b.getSort())
                .collect(Collectors.toList());
        // 如果你当前没一个子集，初始化一个空数组
        if (!CollectionUtils.isEmpty(childrenList)) {
            // 查询以后放回去
            rootList.addAll(childrenList);
            // 再次递归构建即可
            childrenList.forEach(courseCategory -> buckForbackByPid(rootList, courseCategory, subList));
        }
    }


    /**
     * 根据id删除
     * @param ids
     * @return boolean
     * 创建人:yykk
     * 创建时间：2022-05-23 14:38:43
     * @version 1.0.0
     */
    @Override
    public boolean delBatchCategory(String ids) {
        try {
            // 1 : 把数据分割
            String[] strings = ids.split(",");
            // 2: 组装成一个List<Category>
            List<CourseCategory> courseCategoryList = Arrays.stream(strings).map(idstr -> {
                CourseCategory courseCategory = new CourseCategory();
                courseCategory.setId(new Long(idstr));
                return courseCategory;
            }).collect(Collectors.toList());
            // 3: 批量删除
            return this.updateBatchById(courseCategoryList);
        } catch (Exception ex) {
            throw new PugValidatorException(ResultStatusEnum.SERVER_DB_ERROR);
        }
    }


}
